package web.controller;

import java.net.MalformedURLException;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import service.authentification.Contributor;
import service.authentification.IAuthentificator;
import web.form.ChangePwdForm;
import web.form.LoginForm;
import web.form.RecoverPwdForm;
import web.validator.LoginValidator;

/**
 * <b>LoginController  </b>
 * <p>LoginController controle les requêtes pour le service d'authentification.</p>
 * 
 */
@Controller
public class LoginController {
	
	/**
     * Repr&eacute;sente le service d'authentification
     */
	@Resource
	IAuthentificator authentificator;
	
	/**
     * Repr&eacute;sente le service de validation du formulaire de login
     */
	@Resource
	LoginValidator loginValidator;

	/**
     * Controlleur qui renvoi la page d'authentification
     */
	@RequestMapping(value = "/login.htm", method = RequestMethod.GET)
	public String handleRequestLogin(@RequestHeader("Referer") String referer,
			HttpSession session, ModelMap model)  {
		
		if(referer!=null){
			LoginForm loginForm = new LoginForm();		
			model.addAttribute("loginForm",loginForm);
			return "login";
		}else{
			return "redirect : treeview.htm";
		}
	}
	
	/**
     * Controlleur qui recoi le couple identifiant et mot de passe pour authentifier l'utilisateur
     */
	@RequestMapping(value = "/login.htm", method = RequestMethod.POST)
	public String onSubmitLogin(@RequestHeader("Referer") String referer,HttpSession session, 
								@ModelAttribute("loginForm") LoginForm form,
								BindingResult result, ModelMap model) throws Exception {
		Contributor user = authentificator.connect(form.getIdLDAP(),form.getPassword());
		loginValidator.validate(form, result);

		JSONObject json = new JSONObject();
	
		if(user==null ){
			json.put("success", false);
			json.put("message", "Identifiant ou mot de passe incorrecte.");
		}else{
			session.setAttribute("user", user);
			json.put("success", true);
			json.put("message", "Vous êtes bien connecté");
		}
		model.addAttribute("jsonArray", json);
		return "json";
	}
	
	/**
     * Controlleur qui deconnecte l'utilisateur
     */
	@RequestMapping(value = "/logout.htm", method = RequestMethod.GET)
	public String handleRequestLogout(@RequestHeader("Referer") String referer, HttpSession session, ModelMap model) throws MalformedURLException  {
		
		session.removeAttribute("user");
		URIParser uri = new URIParser(referer);
		uri.removeParameter("login");
		return "redirect:"+uri.getUrl();
	}
	
	/**
     * Controlleur qui renvoi la page pour changer le mot de passe
     */
	@RequestMapping(value = "/changePwd.htm", method = RequestMethod.GET)
	public String handleRequestChangePwd(@RequestHeader("Referer") String referer, ModelMap model) throws MalformedURLException  {
		
		URIParser uri = new URIParser(referer);
		uri.removeParameter("login");
		ChangePwdForm form = new ChangePwdForm();
		model.addAttribute("changePwdForm", form);
		return "changePwd";
	}
	
	/**
     * Controlleur qui recoi le nouveau mot de passe et utilise le service d'authentification pour remplacer le mot de asse
     */
	@RequestMapping(value = "/changePwd.htm", method = RequestMethod.POST)
	public String onSubmitChangePwd(@RequestHeader("Referer") String referer, 
			HttpSession session,@ModelAttribute("changePwdForm") ChangePwdForm form,
			BindingResult result,ModelMap model) throws MalformedURLException, JSONException  {
		
		Contributor user = (Contributor)session.getAttribute("user");
		JSONObject json = new JSONObject();
		if(user != null){
			boolean success = authentificator.changePassword(user, form);
			if(success == false){
				json.put("success", false);
				json.put("message", "Mot de passe incorrecte.");
			}else{
				json.put("success", true);
				json.put("message", "Votre mot de passe a bien été modifié");
			}
		}else{
			json.put("success", false);
			json.put("message", "erreur.");
		}
		model.addAttribute("jsonArray", json);
		return "json";
	}
	
	/**
     * Controlleur qui renvoi la page pour signaler un oublie de mot passe
     */
	@RequestMapping(value = "/recoverPwd.htm", method = RequestMethod.GET)
	public String handleRequestRecoverPwd(@RequestHeader("Referer") String referer,
			HttpSession session, ModelMap model) throws MalformedURLException  {
				
		RecoverPwdForm recoverPwdForm = new RecoverPwdForm();
		model.addAttribute("recoverPwdForm",recoverPwdForm);
		return "recoverPwd";
	
	}
	
	/**
     * Controlleur qui recoi une rêquete pour récuprer un mot de passe oublié par l'utilisateur
     */
	@RequestMapping(value = "/recoverPwd.htm", method = RequestMethod.POST)
	public String onSubmitRecoverPw(@RequestHeader("Referer") String referer, 
			HttpSession session,@ModelAttribute("recoverPwdForm") RecoverPwdForm form,
			BindingResult result,ModelMap model) throws Exception  {
		
		boolean success = authentificator.recoverPassword(form.getIdLDAP());
		
		JSONObject json = new JSONObject();
		
		if(success==false ){
			json.put("success", false);
			json.put("message", "Identifiant incorrecte.");
		}else{
			json.put("success", true);
			json.put("message", "Votre mot de passe a bien été réinitialisé.");
		}
		model.addAttribute("jsonArray", json);
		return "json";
	}
}